Profile picture

[Linux] Ubuntu 24.04 -> Rocky 10 마이그레이션

JaehyoJJAng2025년 12월 16일

개요

기존 홈서버에서 운영 중인 Ubuntu 24.04 서버의 모든 서비스(Docker, Gatsby, 데이터 등등)를

새로운 Rocky 서버로 누락 없이 이관하기 위한 과정을 기록해보려고 합니다.


사전 준비

작업 전에, 양쪽 서버의 상태를 확인하겠습니다.

  • Source (Ubuntu 24.04): 기존 운영 서버
  • Target (Rocky 10): 신규 구축 서버

Rocky 네트워크 및 기본 설정

고정 IP 설정하기

먼저 Rocky 리눅스에 네트워크 설정을 진행하도록 하겠습니다.


현재 홈서버는 192.168.219.0/24 대역을 사용 중입니다.


기존 운영 서버인 Ubuntu 24.04의 IP 대역은 192.168.219.110을 사용하고 있습니다.

이와 비슷한 대역인 192.168.219.111 대역으로 Rocky에 설정해주도록 하겠습니다.
(새로운 IP 대역 할당 전 이미 점유되어 있는지 ping 명령어 등으로 확인하는 작업이 필요합니다.)

# 연결 디바이스 확인
nmcli device

# 고정 IP 설정 (ens18)
nmcli con mod ens18 ipv4.addresses 192.168.219.111/24
nmcli con mod ens18 ipv4.gateway 192.168.219.1
nmcli con mod ens18 ipv4.dns "8.8.8.8 8.8.4.4"
nmcli con mod ens18 ipv4.method manual

# 설정 적용 및 재시작
nmcli con down ens18 && nmcli con up ens18

필수 패키지 설치하기

데이터 전송 및 Docker 구동을 위한 기본 도구를 설치하겠습니다.

dnf update -y
dnf install -y rsync curl wget git vim

Docker 컨테이너 및 볼륨 이관


현재 Ubuntu 서버에는 실제 서비스가 운영되고 있는 도커 컨테이너가 다수 존재합니다.


단순히 이미지만 옮기는 것이 아니라 컨테이너와 연동된 Persistent Volume도 같이 옮기는 것이 핵심이죠.


Rocky에 도커 설치

RHEL 계열에 맞는 도커 레포지토리를 추가하고 설치합니다.

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf update -y
dnf install -y docker-ce docker-ce-cli containerd.io

# 도커 서비스 시작
systemctl enable --now docker

데이터 동기화 (rsync)

Ubuntu 서버의 도커 데이터를 Rocky 서버로 밀어넣겠습니다.


데이터 손실 등의 문제를 방지하기 위해 Ubuntu에서 동작 중인 컨테이너들을 잠시 중지(stop)해주세요.


1. 컨테이너 중지

docker stop $(docker ps -a -q)

2. bind mount된 데이터(호스트 폴더) 전송

docker-compose.yaml 파일이 있는 프로젝트 폴더들을 모두 Rocky로 전송하겠습니다.

rsync -avz /home/dev/docker-programs root@192.168.219.111:/home/user/

3. Docker volumes (내부 볼륨) 전송

docker volume create로 생성된 볼륨 데이터는 보통 /var/lib/docker/volumes에 위치합니다.

rsync -avz /var/lib/docker/volumes/ root@192.168.219.111:/var/lib/docker/volumes/

동기화 테스트

Rocky 서버로 이동하여 전송한 볼륨 데이터가 동기화가 되었는지 확인해봅니다.

docker volumes ls

만약 docker volumes ls를 실행했을 때 아무 볼륨도 동기화가 되어있지 않는다면 아래 작업을 수행해보세요.


1. SELinux 권한 이슈

Ubuntu는 SELinux를 사용하지 않지만, Rocky는 기본적으로 사용하고 있습니다.

Ubuntu에서 가져온 파일은 Rocky OS 입장에서 보안 라벨이 없는 파일이라서 도커 데몬 접근이 차단될 수도 있습니다.


이런 경우에는 도커 데몬 로그에 이와 관련한 접근 권한 거부 등의 로그가 발생하니 필수적으로 도커 데몬 로그를 확인해 봅시다.

journalctl -xeu docker 

해결 방법은 다음과 같습니다.

# 1. 도커 데몬이 인식할 수 있도록 소유권 확정 (보통 root)
sudo chown -R root:root /var/lib/docker/volumes

# 2. 파일 권한 설정 (일반적으로 755 혹은 _data 내부는 각 컨테이너 설정 따름)
sudo chmod -R 755 /var/lib/docker/volumes

# 3. ★ 핵심: SELinux 보안 문맥 복구 (이게 안 되어 있으면 안 보일 수 있음)
sudo restorecon -Rv /var/lib/docker/volumes

2. 도커 데몬 재시작

단순히 /var/lib/docker/volumes만 이식한 경우 도커 데몬은 이를 모를 수 있습니다.

강제로 다시 스캔하도록 해야합니다.

sudo systemctl restart docker

저는 이 방법을 통해 도커 볼륨이 정상적으로 동기화되었습니다.


3. Rocky에서 컨테이너 복구

Rocky 서버로 이동하여 전송받은 docker-compose.yaml 경로에서 컨테이너를 실행합니다.

cd /home/user/docker-programs/mysql
docker-compose up -d --build

네이티브 애플리케이션 이관 (gatsby/node.js)

Docker가 아닌 호스트에 직접 설치된 Gatsby, Node.js 앱 이관 작업을 시작하겠습니다.


1. 런타임 환경 구성 (node.js)

제가 운영 중인 Gatsby의 경우 Node.js 버전이 높은 경우 호환성 문제로 실행이 되지 않기 때문에,

기존 Ubuntu와 버전을 동일하게 맞추도록 하겠습니다.

# Node.js 모듈 리스트 확인 및 활성화
sudo dnf module list nodejs
sudo dnf module enable nodejs:20
sudo dnf install -y nodejs
sudo npm install -g gatsby-cli pm2

2. 프로젝트 소스코드 이관

node_modules 폴더는 OS 아키텍처에 따라서 바이너리가 다를 수 있습니다.

그러므로 해당 파일은 제외하고 전송한 뒤, Rocky에서 재설치하는 것이 가장 깔끔합니다.

# node_modules와 .cache를 제외하고 전송
rsync -avz --exclude 'node_modules' --exclude '.cache' --exclude '.trivy' /path/to/gatsby-project root@192.168.219.210:/path/to/dest

의존성 재설치 및 빌드

cd /path/to/gatsby-project
npm install
gatsby build

systemd 서비스 이관

현재 Ubuntu 서버에는 Systemd 기반의 개별 서비스가 1개 동작하고 있습니다.


해당 서비스또한 Rocky로 이관해주도록 하겠습니다.


Ubuntu 서버에서 현재 동작 중인 systemd 리스트 확인

$ systemctl list-units --state=running

# 바로 아래 resource 서비스입니다.
resource.service                  loaded active running Python Server Resource Monitoring

resource.service 서비스 파일은 /etc/systemd/system/resource.service에 위치하고 있습니다.

해당 파일을 Rocky로 이관해줍시다.

rsync -avz /etc/systemd/system/resource.service root@192.168.219.111:/etc/systemd/system/

시스템 설정 및 기타 데이터 이관

놓치기 쉬운 시스템 설정들을 챙깁니다.


사용자 계정 및 Crontab

/etc/passwd를 덮어쓰는 것은 위험하므로, 사용자 계정은 Rocky에서 새로 생성하고 홈 디렉토리 데이터만 rsync 하는 것을 추천합니다.

  • Crontab 백업 및 복원
    • Ubuntu: crontab -l > my_cron_backup.txt
    • 파일 전송 후 Rocky: crontab my_cron_backup.txt

방화벽 설정 (Firewalld)

Ubuntu의 ufw 규칙을 Rocky의 firewalld로 변환하여 적용해야 합니다.

# 예: 80, 443, 8000 포트 허용
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8000/tcp
sudo firewall-cmd --reload

마무리

마이그레이션 요약 체크리스트

  • [✔️] 네트워크: Rocky 서버 IP (192.168.219.210) 설정 완료
  • [✔️] Docker: 볼륨 데이터 Rsync 완료 및 컨테이너 Up
  • [✔️] App: Node.js 설치 및 Gatsby 프로젝트 빌드/구동 완료
  • [✔️] Data: DB, 정적 파일 등 누락 없이 Rsync 완료
  • [✔️] System: 방화벽 포트 오픈 및 Crontab 등록 완료
    Tag -

Loading script...